// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:build linux&（mips64 | | mips64le）

package syscall

const _SYS_setgroups = SYS_SETGROUPS

// sys Dup2（oldf int，newfd int）（错误）
// sysnb EpollCreate（size int）（fd int，error error）
// sys Fchown（错误）=SYS_NEWFSTATAT 
// SYS Ftruncate（fd int，length int64）（错误）
// sysnb Getegid（）（egid int）
// sysnb Geteuid（）（euid int）
// sysnb Getgid（）（gid int）
// sysnb Getrlimit（resource int，rlim rlim*Rlimit）（错误）
// sys Lchown（路径字符串，uid int，gid int）（error）
// sys Listen（s int，n int）（error）
// sys Pause（）（error）
// sys Pread（fd int，p[]字节，offset int64）（n int，error error）=sys PREAD64 
// sys Seek（fd int，off int64，whence int）（off int64，error error）=sys LSEEK 
// sys sendfile（outd int，infd int，offset*int64，count int）（write int，error error）
// sys Setfsgid int
// sysnb Setrlimit（resource int，rlim*Rlimit）（error error）
// sys Shutdown（fd int，how int）（error error）
// sys Splice（rfd int，roff*int64，wfd int，woff*int64，len int，flags int）（n int64，error error）
// sys Ustat（dev int，ubuf*Ustat_t）（err error）
// sys accept（s int，rsa*RawSockaddrAny，addrlen*_Socklen）（fd int，error error）
// sys ACCEP4（s int，rsa*RawSockaddrAny，addrlen*_Socklen，flags int）（fd int，error）
// sys connect（s int，addr unsafe.Pointer，addrlen _Socklen）（error error）
// sysnb getgroups（n int，list*_Gid_t）（nn int，error error）
// sys getsockopt（s int，level int，name int，name int，val unsafe.Pointer，vallen*_Socklen）（error）
// sysnb socket（domain int，typ int，proto int）（fd int，error）
// sysnb socketpair（domain int，typ int，proto int，fd*[2]int32）（错误）
// sys recvfrom（fd int，p[]字节，flags int，from*RawSockaddrAny，fromlen*_Socklen）（n int，error error）
// sys sendto（s int，buf[]字节，flags int，to unsafe.Pointer，addrlen _Socklen）（error）
// sys recg（s int，msg*msg*ghdr，flags int，error）
// sys mmap（addr uintpr，length uintpr，prot int，flags int，fd int，offset int64）（xaddr uintpr，error error）

type sigset_t struct {
	X__val [16]uint64
}


func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
	var ts *Timespec
	if timeout != nil {
		ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000}
	}
	return pselect(nfd, r, w, e, ts, nil)
}

// SYS futimesat（dirfd int，path string，times*[2]Timeval）（error error）
// sysnb Gettimeofday（tv*Timeval）（error）

func Time(t *Time_t) (tt Time_t, err error) {
	var tv Timeval
	err = Gettimeofday(&tv)
	if err != nil {
		return 0, err
	}
	if t != nil {
		*t = Time_t(tv.Sec)
	}
	return Time_t(tv.Sec), nil
}

// SYS Utime（path string，buf*Utimbuf）（error）
// SYS utimes（path string，times*[2]Timeval）（error）

func setTimespec(sec, nsec int64) Timespec {
	return Timespec{Sec: sec, Nsec: nsec}
}

func setTimeval(sec, usec int64) Timeval {
	return Timeval{Sec: sec, Usec: usec}
}

func Ioperm(from int, num int, on int) (err error) {
	return ENOSYS
}

func Iopl(level int) (err error) {
	return ENOSYS
}

type stat_t struct {
	Dev        uint32
	Pad0       [3]int32
	Ino        uint64
	Mode       uint32
	Nlink      uint32
	Uid        uint32
	Gid        uint32
	Rdev       uint32
	Pad1       [3]uint32
	Size       int64
	Atime      uint32
	Atime_nsec uint32
	Mtime      uint32
	Mtime_nsec uint32
	Ctime      uint32
	Ctime_nsec uint32
	Blksize    uint32
	Pad2       uint32
	Blocks     int64
}

// sys stat（路径字符串，st*stat_t）（错误）

func Fstat(fd int, s *Stat_t) (err error) {
	st := &stat_t{}
	err = fstat(fd, st)
	fillStat_t(s, st)
	return
}

func Lstat(path string, s *Stat_t) (err error) {
	st := &stat_t{}
	err = lstat(path, st)
	fillStat_t(s, st)
	return
}

func Stat(path string, s *Stat_t) (err error) {
	st := &stat_t{}
	err = stat(path, st)
	fillStat_t(s, st)
	return
}

func fillStat_t(s *Stat_t, st *stat_t) {
	s.Dev = st.Dev
	s.Ino = st.Ino
	s.Mode = st.Mode
	s.Nlink = st.Nlink
	s.Uid = st.Uid
	s.Gid = st.Gid
	s.Rdev = st.Rdev
	s.Size = st.Size
	s.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)}
	s.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)}
	s.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)}
	s.Blksize = st.Blksize
	s.Blocks = st.Blocks
}

func (r *PtraceRegs) PC() uint64 { return r.Regs[64] }

func (r *PtraceRegs) SetPC(pc uint64) { r.Regs[64] = pc }

func (iov *Iovec) SetLen(length int) {
	iov.Len = uint64(length)
}

func (msghdr *Msghdr) SetControllen(length int) {
	msghdr.Controllen = uint64(length)
}

func (cmsg *Cmsghdr) SetLen(length int) {
	cmsg.Len = uint64(length)
}

func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno)
